package algorithm_demo.demo01;

/**
 * 路径总和
 * 给你二叉树的根节点root 和一个表示目标和的整数targetSum 。判断该树中是否存在 根节点到叶子节点 的路径，这条路径上所有节点值相加等于目标和targetSum 。如果存在，返回 true ；否则，返回 false 。
 * <p>
 * 叶子节点 是指没有子节点的节点。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/path-sum
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * <p>
 * <p>
 *
 * @author Api
 * @date 2023/2/5 16:06
 */
public class Code33_PathSum {

    public static class TreeNode {
        public int val;
        public TreeNode left;
        public TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    //是否为目标值
    public static boolean isTargetSum = false;

    public boolean hasPathSum(TreeNode root, int targetSum) {
        if (root == null) {
            return false;
        }
        isTargetSum = false;
        process(root, 0, targetSum);
        return isTargetSum;
    }


    public static void process(TreeNode root, int preSum, int targetSum) {
        //判断是否到达叶子节点（到达叶子节点的依据为：左边和右边均为null）
        if (root.left == null && root.right == null) {
            //校验传入的目标sum值，是否相等，如果相等则返回true
            if (preSum + root.val == targetSum) {
                isTargetSum = true;
            }
            return;
        }
        preSum += root.val;
        if (root.left != null) {
            process(root.left, preSum, targetSum);
        }
        if (root.right != null) {
            process(root.right, preSum, targetSum);
        }
    }


}
